/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Util;

import Entities.Paziente;
import Entities.Vaccinazione;
import JDBC.ConnectionPool;
import JDBC.ConnectionPoolException;
import JDBC.Operazioni;
import com.itextpdf.text.BadElementException;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chapter;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author marcy
 */
public class Pdf {

    private ArrayList<Paziente> lista;
    private Document documento;
    private ResultSet set;
    private String medico;
    private int id_medico;
    //Oggetti connessione database
    ConnectionPool pool;
    Connection conn;

    public Pdf(int[] ids, String medico, String realPath, String contextPath, int id_medico) {
        this.id_medico = id_medico;
        lista = new ArrayList(ids.length);
        for (int i = 0; i < ids.length; i++) {
            lista.add(new Paziente(ids[i]));
        }
        this.medico = medico;

        String titolo = "";
        titolo += new Date().getDate() + "-";
        titolo += new Date().getMonth() + "-";
        titolo += new Date().getYear() + 1900 + "-";
        titolo += medico;
        titolo += ".pdf";

        try {
            documento = new Document(PageSize.A4);
            PdfWriter.getInstance(documento, new FileOutputStream(realPath + "/protected/pdf/" + titolo));
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        } catch (DocumentException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        }
        scriviDocumento();
        chiudiDocumento();
        
        CaricaPdfDatabase(contextPath+"/protected/pdf/"+titolo, 1);

    }

    private void inserisciPaziente(Document doc, Paziente paz, int i) {

        Paragraph par = new Paragraph(paz.getNome() + " " + paz.getCognome(),
                FontFactory.getFont(FontFactory.COURIER, 17, BaseColor.BLUE));
        Chapter chap = new Chapter(par, i + 1);

        //Immagine paziente
        Image img = null;
        try {
            img = Image.getInstance("http://localhost:8084" + paz.getFoto());
            img.scaleToFit(150, 150);
        } catch (BadElementException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        }

        //tabella vaccinazioni
        PdfPTable table = tabellaVac(paz);


        //Si aggiunge tutto al documento
        try {
            documento.add(chap);
            documento.add(img);
            documento.add(new Paragraph("\n Data Ultime Vaccinazioni ( Massimo 10 ):\n\n"));
            documento.add(table);
            documento.add(new Paragraph("\n Pertanto il medico " + this.medico + " desidera effettuare una vaccinazione di richiamo.\n"));
            documento.add(new Paragraph("Si prega quindi di recarsi il più presto possibile ai nostri ambulatori per effettuare la procedura"));

        } catch (DocumentException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private PdfPTable tabellaVac(Paziente paz) {

        set = new Vaccinazione().getLastByIdPaziente(paz.getId());
        PdfPTable tab = new PdfPTable(3);
        PdfPCell cell = new PdfPCell(new Paragraph("Data Vaccinazione", FontFactory.getFont(FontFactory.COURIER_BOLD, 12)));
        cell.setColspan(1);
        tab.addCell(cell);
        cell = new PdfPCell(new Paragraph("Eseguita da", FontFactory.getFont(FontFactory.COURIER_BOLD, 12)));
        cell.setColspan(2);
        tab.addCell(cell);
        try {
            while (set.next()) {
                for (int i = 1; i <= 3; i++) {
                    tab.addCell(set.getString(i));
                }
            }
        } catch (SQLException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        }

        return tab;
    }

    private void scriviDocumento() {
        documento.open();
        Paziente paz;
        for (int i = 0; i < lista.size(); i++) {
            paz = lista.get(i);
            documento.newPage();
            inserisciPaziente(documento, paz, i);
            inserisciVaccinazione(paz.getId(), id_medico);

        }
    }

    private void chiudiDocumento() {
        documento.close();
    }

    private void CaricaPdfDatabase(String url, int medico) {
        try {
            pool = ConnectionPool.getConnetionPool();
            conn = pool.getConnection();
        } catch (ConnectionPoolException ex) {
            Logger.getLogger(Pdf.class.getName()).log(Level.SEVERE, null, ex);
        }
        Operazioni.execute_statement("INSERT INTO Pdf VALUES "
                + "('" + url + "', CURRENT_TIMESTAMP, '1' )", conn);

        pool.relaseConnection(conn);
        conn = null;
        pool = null;
        System.gc();

    }

    private void inserisciVaccinazione(Integer id_paziente, int id_medico) {
        new Vaccinazione().insertNewVaccinazione(id_paziente, id_medico);
    }
}
